{***************************************************************
    SpyGestion  Copyright (C) 2008 Christophe KOALI <nature2gas@gmail.com>
    
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
    
****************************************************************}
unit modBaseRessources;

interface

uses modBaseType;


// Additionne les ressources
function mbrAdditionneRessource(a1, a2: TOGRessourceAll): TOGRessourceAll;


// Définit la quantité de ressource necessaire pour contruire l'élément
function mbrGetRessourceNeed(CurrRes, CostBuild: TOGRessourceAll): TOGRessourceAll;

// A partir d'une "production par heure", la fonction retourne la quantite de ressource
// produire durant une "duree"
function mbrGetEstimatedProduction(Duree: integer; ProductionParHeure: integer): integer;



// Renvoi en secondes, le temps necessaire pour produire la ressource
// désirée, cette ressource peut correspondre à n'importe quoi
function mbrGetTimeNeedToProductThisTypeOfRes(Quantite: integer; ProductionParHeure: integer): integer;


// Duplique l'objet pointé par un pointeur
//function mbrDupliquePointeur(Source: POGResUsed): POGResUsed;




implementation



////////////////////////////////
// Renvoi en secondes, le temps necessaire pour produire la ressource
// désirée, cette ressource peut correspondre à n'importe quoi
function mbrGetTimeNeedToProductThisTypeOfRes(Quantite: integer; ProductionParHeure: integer): integer;
var Heures, Secondes: integer;
    i: integer;
    ProducParSecs: Single;
begin

    if ProductionParHeure = 0 then begin
       Result := -1;
       exit;
    end else if Quantite <= 0 then begin
       Result := 0;
       exit;
    end else if ProductionParHeure < 0 then begin
       // avec une production négative, impossible d'atteindre la quantitié à produire
       Result := -1;
       exit;
    end;

       

    Heures := Quantite div ProductionParHeure;


    if Heures > 0 then begin
       Quantite := Quantite - (ProductionParHeure * Heures);
    end;

    // Calcul le nombre de minutes
    ProducParSecs := ProductionParHeure / 3600;

    Secondes := Trunc(Quantite / ProducParSecs);

    // Majoration
    Inc(Secondes);

    Result := (Heures * 3600) + Secondes;
end;


function mbrGetEstimatedProduction(Duree: integer; ProductionParHeure: integer): integer;
var Heures, Secondes: integer;
    i: integer;
    ProducParSecs: Single;
begin

    if ProductionParHeure = 0 then begin
       Result := 0;
       exit;
    end else if Duree <= 0 then begin
       Result := 0;
       exit;
    end else if ProductionParHeure < 0 then begin
       // avec une production négative, impossible d'atteindre la quantitié à produire
       Result := 0;
       exit;
    end;


    Result := 0;

    if Duree >= 3600 then begin
       Heures := Duree div 3600;
       Duree := Duree - (Heures * 3600);

       Result := Heures * ProductionParHeure;
    end;

    // Calcul la production par secondes
    ProducParSecs := ProductionParHeure / 3600;

    if Duree > 0 then
       Result := Result + Trunc(ProducParSecs * Duree);


end;

/////////////////////////////////
// Définit la quantité de ressource necessaire pour contruire l'élément
function mbrGetRessourceNeed(CurrRes, CostBuild: TOGRessourceAll): TOGRessourceAll;
begin
    Result.Metal     := CostBuild.Metal - CurrRes.Metal;
    Result.Cristal   := CostBuild.Cristal - CurrRes.Cristal;
    Result.Deuterium := CostBuild.Deuterium - CurrRes.Deuterium;
    Result.Energie   := 0;

    if Result.Metal < 0     then Result.Metal := 0;
    if Result.Cristal < 0   then Result.Cristal := 0;
    if Result.Deuterium < 0 then Result.Deuterium := 0;
end;



function mbrAdditionneRessource(a1, a2: TOGRessourceAll): TOGRessourceAll;
begin
   Result := mbtAddPrix(a1, a2, 1);
end;


(*
function mbrDupliquePointeur(Source: POGResUsed): POGResUsed;
begin
       New(Result);

      // Result.IdOpt := Source.IdOpt;
       Result.prMetal      := Source.prMetal;
       Result.prCristal    := Source.prCristal;
       Result.prDeuterium  := Source.prDeuterium;
       Result.prEnergie    := Source.prEnergie;
       Result.csEnergieUsed   := Source.csEnergieUsed;
       Result.csEnergieAllow  := Source.csEnergieAllow;
       Result.Activite        := Source.Activite;

       Result.ActiviteForOptimization := Source.ActiviteForOptimization;
       Result.Element := Source.Element;
       Result.ElementGID := Source.ElementGID;
       Result.ElementLVL := Source.ElementLVL;


end;
*)

end.
